﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Collections;
using Grishko.DataTier;
using System.ComponentModel;
using Grishko.SerilizeTools;


namespace OutdoorLib.BaseEntity.Face
{
    public enum EnContactType { Phone, Fax, Mobail, Address, Email, URL } ;
    /// <summary>
    /// контакты лиц
    /// </summary>    
    
    public class Contact : EntitySingle
    {
        public static EnContactType ConvertStringToContactType(string sValue)
        {
            return EnContactType.Address;
        }
        private bool _MainContact = false;
        public bool MainContact
        {
            get { return _MainContact; }
            set { _MainContact = value; }
        }


        public EnContactType ContactType { get; set; }

        [DefaultValue("")]
        [SrchItemInfo(TxtPropertyName = "Значение")]
        public string ContactValue
        {
            get;
            set;
        }

    }

    public class ContactList : EntityList
    {
        /// <summary>
        /// Если добавляется основной контакт - остальные контакты этого типа помечаются как не основные.
        /// </summary>
        /// <param name="obj"></param>
        public override void Add(EntitySingle obj)
        {
            if (!(obj is Contact)) throw new Exception("Объект не является контактом.");
            
            Contact item = (Contact)obj;
            if (item.ContactValue == String.Empty) return; 
            if (item.MainContact)
            {
                foreach (Contact cnt in GetContactList(item.ContactType  )) cnt.MainContact = false;
            }
            base.Add(item);
        }


        /// <summary>
        /// Вернуть список контактов заданного типа 
        /// </summary>
        /// <param name="ContactType"></param>
        /// <returns></returns>
        public List<Contact> GetContactList(EnContactType ContactType)
        {
           var q = from c in this.ToList <Contact>() where c.ContactType  == ContactType select c;
           return q.ToList<Contact>();
        }
     
        /// <summary>
        /// Вернуть основной контакт данного типа
        /// </summary>
        /// <param name="ContactType"></param>
        /// <returns></returns>
        public Contact GetMainContact(EnContactType ContactType)
        {
            
            var q = from c in this.ToList<Contact>() where c.ContactType == ContactType && c.MainContact ==true  select c;
            this.Reset();
            Contact[] r=  q.ToArray<Contact>();            
            if (r.Length == 0) return null;
            return r[0];
        }


        /// <summary>
        /// Убарть из списка контактов контакты определенного типа
        /// </summary>
        /// <param name="DictionaryTypeID"></param>
        public void RemoveItems(EnContactType ContactType)
        {
            List<Contact> r = GetContactList(ContactType); 
            foreach (Contact item in r)
            {
                 this.Remove(item.ID);
            }
            r.Clear();
        }

        /// <summary>
        /// сортировщик конактов - телефоны , майлы, адреса
        /// (основные / остальные )
        /// </summary>
        /// <returns></returns>
        public Contact[] GetSortedList()
        {
            Contact[] r = this.ToArray<Contact>();
            Array.Sort(r, new ContactSort());
            return r;
        }

        /// <summary>
        /// сортировщик конактов - телефоны , майлы, адреса
        /// (основные / остальные )
        /// </summary>
        private class ContactSort : IComparer
        {
            #region IComparer Members

            public int Compare(object x, object y)
            {
                                
                Contact xv =(Contact )x;
                Contact yv =(Contact )y;
                
                Func <Contact ,decimal > f= delegate (Contact cnt)
                {
                decimal r=0;
                switch (cnt.ContactType )
                    {
                        case EnContactType.Phone :
                        r=r+4;
                        break ;
                        case EnContactType.Email:
                        r=r+3;
                        break ;
                        case EnContactType.Address:
                        r=r+2;
                        break ;
                        case EnContactType.URL:
                        r = r + 1;
                        break;
                    }
                    return r+(cnt.MainContact?(1/10):0);
                };


                if(f(xv)== f(yv))return  0 ;
                if (f(xv) < f(yv))
                    return 1;
                else
                    return -1;

            }

            #endregion
        }

        public string GetContactsAsString(string Spliter)
        {
            StringBuilder b = new StringBuilder();
            foreach (Contact item in GetSortedList())
            {
                b.Append(item.ContactValue);
                b.Append(Spliter);
            }
            string r = b.ToString();
            if (string.Empty == r) return r;
            int i = r.LastIndexOf(Spliter);
            return r.Substring(0, i);

        }

        public string GetContactsAsString(string Spliter, EnContactType[] ContactType)
        {
            StringBuilder b = new StringBuilder();
            foreach (Contact item in GetSortedList())
            {
                foreach (EnContactType s in ContactType)
                {
                    if (s == item.ContactType )
                    {
                        b.Append(item.ContactValue);
                        b.Append(Spliter);
                    }
                }

            }
            string r = b.ToString();
            if (string.Empty == r) return r;
            int i = r.LastIndexOf(Spliter);
            return r.Substring(0, i);
        }

    }

   
}
